public class PrimeNumbersSieve {
    public static void main(String[] args) {
        int range = 20000;
        boolean[] isPrime = new boolean[range + 1];
        
        // 初始化：假设所有数都是素数
        for (int i = 2; i <= range; i++) {
            isPrime[i] = true;
        }

        // 埃氏筛法
        for (int p = 2; p * p <= range; p++) {
            if (isPrime[p]) {
                // 把 p 的倍数都标记为非素数
                for (int i = p * p; i <= range; i += p) {
                    isPrime[i] = false;
                }
            }
        }

        // 输出结果，每行5个
        int count = 0;
        System.out.println("1 ~ " + range + " 范围内的素数如下（每行5个，使用筛法）：");
        for (int i = 2; i <= range; i++) {
            if (isPrime[i]) {
                System.out.printf("%6d", i);
                count++;
                if (count % 5 == 0) {
                    System.out.println();
                }
            }
        }

        if (count % 5 != 0) {
            System.out.println();
        }
    }
}